#!/usr/bin/env python

import os
common_curves = os.path.join(os.getcwd(), 'src', 'common')

def install_cremona():
    from sqlite3 import connect

    if 'SAGE_SHARE' not in os.environ:
        raise RuntimeError("SAGE_SHARE undefined, maybe run `sage -sh`?")

    cremona_root = os.path.join(os.environ['SAGE_SHARE'], 'cremona')
    if not os.path.exists(cremona_root):
        os.makedirs(cremona_root)

    target = os.path.join(cremona_root, 'cremona_mini.db')

    if os.path.exists(target):
        os.remove(target)

    con = connect(target)

    con.execute('CREATE TABLE t_class(rank INTEGER, class TEXT PRIMARY KEY,'
            ' conductor INTEGER)')
    con.execute('CREATE TABLE t_curve(curve TEXT PRIMARY KEY, class TEXT, tors'
            ' INTEGER, eqn TEXT UNIQUE)')
    con.execute('CREATE INDEX i_t_class_conductor ON t_class(conductor)')
    con.execute('CREATE INDEX i_t_curve_class ON t_curve(class)')

    class_data = []
    curve_data = []

    for line in open(os.path.join(common_curves, 'allcurves.00000-09999')):
        N, iso, num, eqn, r, tors = line.split()
        cls = N + iso
        cur = cls + num
        if num == "1":
            class_data.append((N, cls, r))
        curve_data.append((cur, cls, eqn, tors))

    con.executemany('INSERT INTO t_class(conductor,class,rank) VALUES'
            ' (?,?,?)', class_data)
    con.executemany('INSERT INTO t_curve(curve,class,eqn,tors) VALUES'
            ' (?,?,?,?)', curve_data)

    con.commit()

def install_ellcurves():
    import shutil, tempfile

    if 'SAGE_SHARE' not in os.environ:
        raise RuntimeError("SAGE_SHARE undefined, maybe run `sage -sh`?")

    target = os.path.join(os.environ['SAGE_SHARE'], 'ellcurves')
    if os.path.exists(target):
        try:
            shutil.rmtree(target)
        except OSError:
            os.remove(target)

    shutil.move(os.path.join('src', 'ellcurves'), target)
    rank = {}
    for line in open(os.path.join(common_curves, 'allcurves.00000-09999')):
        r = line.split()[4]
        if r not in rank:
            rank[r] = open(tempfile.mkstemp()[1], 'w')
        rank[r].write(line)

    for r, f in rank.items():
        f.close()
        endpath = os.path.join(target, 'rank' + r)
        if os.path.exists(endpath):
            old = tempfile.mkstemp()[1]
            shutil.move(endpath, old)
            shutil.move(f.name, endpath)
            f = open(endpath, 'a')
            tmp = open(old, 'r')
            f.write(tmp.read())
            tmp.close()
            f.close()
            os.remove(old)
        else:
            shutil.move(f.name, endpath)
        os.chmod(endpath, 0o644)

if __name__ == '__main__':
    install_cremona()
    install_ellcurves()
